package com.hejielife.singleton;

//双重检验锁 双重检验锁模式（double checked locking pattern），是一种使用同步块加锁的方法。
//程序员称其为双重检查锁，因为会有两次检查 instance == null，一次是在同步块外，一次是在同步块内。
//为什么在同步块内还要再检验一次？因为可能会有多个线程一起进入同步块外的 if，
//如果在同步块内不进行二次检验的话就会生成多个实例了。
//线程安全
public class SingletonDemo5 {
	// volatile 防止指令重排
	private static volatile SingletonDemo5 singletonDemo05;

	private SingletonDemo5() {
	}

	public static SingletonDemo5 getInstance() {
		if (singletonDemo05 == null) {
			synchronized (SingletonDemo5.class) {
				if (singletonDemo05 == null) {
					singletonDemo05 = new SingletonDemo5();
				}
			}
		}
		return singletonDemo05;
	}

	public static void main(String[] args) {
		SingletonDemo5 instance1 = SingletonDemo5.getInstance();
		SingletonDemo5 instance2 = SingletonDemo5.getInstance();
		System.out.println(instance1 == instance2);
	}
}
